#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>

#define SERV_PORT 12345
#define MAXLINE 1024

// 错误处理函数
void error(int status, int errnum, const char *message) {
    fprintf(stderr, "%s: %s\n", message, strerror(errnum));
    exit(status);
}

// 创建TCP服务器的函数
int tcp_server(int port) {
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        error(1, errno, "socket error");
    }

    // 初始化服务器地址
    struct sockaddr_in servaddr;
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(port);

    // 将套接字与地址绑定
    if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
        error(1, errno, "bind error");
    }

    // 开始监听连接
    if (listen(sockfd, 5) < 0) {
        error(1, errno, "listen error");
    }

    return sockfd;
}

int main(int argc, char **argv) {
    // 创建TCP服务器
    int listen_fd = tcp_server(SERV_PORT);

    int conn_fd;
    char buf[MAXLINE];

    // 无限循环，等待并处理客户端连接
    for (;;) {
        struct sockaddr_in cliaddr;
        socklen_t clilen = sizeof(cliaddr);
        // 接受新的连接请求
        conn_fd = accept(listen_fd, (struct sockaddr *)&cliaddr, &clilen);

        // 处理连接请求失败的情况
        if (conn_fd < 0) {
            error(1, errno, "accept error");
        }

        int n;
        // 循环接收客户端发送的数据
        while ((n = read(conn_fd, buf, MAXLINE)) > 0) {
            // 将接收到的数据设为以空字符结尾，并打印到屏幕
            buf[n] = 0;
            printf("received: %s\n", buf);

            // 将接收到的数据回发给客户端
            if (write(conn_fd, buf, n) < 0) {
                error(1, errno, "write error");
            }
        }

        // 处理接收数据出错的情况
        if (n < 0) {
            error(1, errno, "read error");
        }

        // 关闭与客户端的连接
        close(conn_fd);
    }
}
